package com.drore.logapp.http.converter;

import android.text.TextUtils;
import android.util.Log;

import com.drore.app.utils.LogUtils;
import com.drore.logapp.bean.BaseBean;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import okhttp3.ResponseBody;
import retrofit2.Converter;

/**
 * desc
 *
 * @author sixbing
 * @date 2018/12/12 9:50
 */
public class GsonResponseBodyConverter<T> implements Converter<ResponseBody, Object> {
    private String TAG = "GsonResponseBodyConverter";
    private final Gson gson;
    private final TypeAdapter<T> adapter;

    GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
//        JsonReader jsonReader = gson.newJsonReader(value.charStream());
        String json = value.string();
        if (TextUtils.isEmpty(json)) {
            json = "{}";
        }
        LogUtils.e(TAG, "" + json);
        JsonReader jsonReader = new JsonReader(new InputStreamReader(new ByteArrayInputStream(json.getBytes())));
        try {
            Object obj = adapter.read(jsonReader);
            handlerTokenTimeOut(obj);
            return (T) obj;
        } finally {
            value.close();
        }
//        //ResponseData中的流只能使用一次，我们先将流中的数据读出在byte数组中。这个方法中已经关闭了ResponseBody,所以不需要再关闭了
//        byte[] valueBytes = value.bytes();
//        JsonReader jsonReader = null, errorJsonReader = null;
//        try {//try中的为正常流程代码
//            InputStreamReader charReader = new InputStreamReader(new ByteArrayInputStream(valueBytes), "UTF-8");//后面的charset根据服务端的编码来定
//            jsonReader = gson.newJsonReader(charReader);//原来是使用value.charStream
//            Object obj = adapter.read(jsonReader);
//            handlerTokenTimeOut(obj);
//            return (T)obj;
//        } catch (JsonSyntaxException e) {//当catch到这个错误说明gson解析错误，基本肯定是服务端responseData的问题，此时我们自己解析
//
//            InputStreamReader errorReader = new InputStreamReader(new ByteArrayInputStream(valueBytes), "UTF-8");//后面的charset根据服务端的编码来定
//            errorJsonReader = gson.newJsonReader(errorReader);
//            BaseBean errorResponse = new BaseBean();
//            errorResponse.message="json 解析出错";
//            errorResponse.data = null;//设为null
//            errorJsonReader.beginObject();
//            while (errorJsonReader.hasNext()) {
//                String nextName = errorJsonReader.nextName();
//                if ("errCode".equals(nextName)) {
//                    errorResponse.errCode = Integer.valueOf(errorJsonReader.nextString());
//                } else {
//                    errorJsonReader.skipValue();//跳过所有其他的值
//                }
//            }
//            errorJsonReader.endObject();
//
//            handlerTokenTimeOut(errorResponse);
//            return (T)errorResponse;
//        } finally {
//            if (jsonReader != null)
//                jsonReader.close();
//            if (errorJsonReader != null)
//                errorJsonReader.close();
//        }
    }

    private void handlerTokenTimeOut(Object obj) {
        if (obj instanceof BaseBean) {//token过期则抛出异常
            BaseBean baseBean = (BaseBean) obj;
            Log.e(TAG, "=============>>请求状态码=" + baseBean.getStatus());
            if (baseBean.getMessage() != null && baseBean.getMessage().contains("token")) {
                Log.e(TAG, "=============>>need Token_refresh");
                throw new IllegalArgumentException("Token_refresh");//异常类型可以自己定义
            }
        }
    }


}
